6.x - #4124
Draft
lukeholder wants to merge 334 commits into
Draft
6.x#4124lukeholder wants to merge 334 commits into
lukeholder wants to merge 334 commits into
Conversation
Migrates SalesController, DiscountsController, CatalogPricingRulesController, CatalogPricingController, PromotionsController to src/Http/Controllers/Settings/. Fixes a correctness gap found from Stage 9b: pageTemplate()-based controllers need storeSwitcher/storeSettingsNav passed explicitly (the legacy BaseStoreManagementController::renderTemplate() override injected these automatically for every subclass; HasStoreManagementScreen only does the equivalent for the CpScreenResponse path). Retroactively fixes ShippingRulesController::edit() and applies it correctly to SalesController. BaseStoreManagementController is not deleted yet - PaymentCurrenciesController and StoreManagementController (Stage 9e) still extend it.
Migrate StoreManagementController, StoresController, SettingsController, OrderSettingsController, PaymentCurrenciesController to src/Http/Controllers/Settings/. Delete BaseStoreManagementController now that nothing extends it. Fix a real authorization gap spanning the already-merged Stages 9b-9d: BaseStoreManagementController::init() always required commerce-manageStoreSettings on top of each area's own permission, but the route middleware added in those stages only checked the area-specific one. Wrap the whole commerce/store-management/* route group in can:commerce-manageStoreSettings, with each area's permission nested inside. Fix a pre-existing bug in Transfers::getFieldLayout(), still typed against the legacy craft\models\FieldLayout/FieldLayoutTab, which throws a TypeError now that getLayoutByType() returns the new CraftCms\Cms\FieldLayout\FieldLayout.
…ser Orders) Migrate OrderStatusesController, LineItemStatusesController to src/Http/Controllers/Settings/, and UserOrdersController to src/Http/Controllers/. BaseFrontEndController stays in src-yii2/ for now — CartController, DownloadsController, PaymentSourcesController, PaymentsController, and UsersController still extend it. Fix a real bug in OrderStatusesController::edit(): the email dropdown was typed against the legacy craft\commerce\models\Email, but Emails::getAllEmails() now returns the already-migrated CraftCms\Commerce\Email\Models\Email, causing a TypeError.
Migrate CartController to src/Http/Controllers/. Add
src/Http/RateLimiters/{CartRateLimiter,CartChallengeRateLimiter} replacing
the Yii2 RateLimiter behavior, registered via RateLimiter::for() in
Plugin::register() and applied through throttle: route middleware.
Replace Craft::$app->getMutex() with Cache::lock()->block(), catching
LockTimeoutException instead of relying on a bool return. Drop the
activeAttributes()-based attribute-scoped validation (a Yii2 Model concept
with no Ruleset equivalent) in favor of validate(null, false), matching the
code's own already-satisfied @todo to remove the pre-Craft-4.4 branch.
Use Request::input() instead of Request::post() throughout since post()
doesn't parse JSON bodies the way Yii2's getBodyParam() did.
Migrate OrdersController (2,227 lines, 29 actions) to src/Http/Controllers/. Completes Stage 9f. Fix a real, repeated bug class: the legacy file has no declare(strict_types=1), so PHP silently coerced numeric-string request params into strictly int-typed service method parameters (getOrderById, getTransactionById, getUserById, getEmailById, getStoreBySiteId, getInventoryLocationById, getPurchasableById, AdminTable::paginationLinks()). The new file does declare strict_types=1, so every one of those call sites needed an explicit (int) cast. Fix a pre-existing bug in transactionRefund() where $transaction-> paymentCurrency was read before the null check. Replace Craft::$app->getElements()->canView()/canDelete() with $order->canView($user)/canDelete($user) — authorization moved onto the element itself and now takes an explicit user argument.
Migrate ProductsController, VariantsController to src/Http/Controllers/, and ProductTypesController to src/Http/Controllers/Settings/. Replace Element::SCENARIO_ESSENTIALS with $product->ruleset->useScenario(ElementRules::SCENARIO_ESSENTIALS) and Craft::$app->getElements()->canSave() with $product->canSave($user), confirmed against cms-6's own StoreEntryController reference implementation for draft creation. Leave Commerce's asset bundles on the legacy registerAssetBundle() path — the newer LegacyAssetInterface/InternalAssetRegistry system is itself documented as a deprecated stopgap, not worth migrating to.
Migrate PaymentsController, PaymentSourcesController to src/Http/Controllers/. BaseFrontEndController stays in src-yii2/ — DownloadsController and UsersController still extend it. Extract cartArray() into a shared HasCartArray trait now that PaymentsController is a second real consumer alongside CartController. Add commerce/payments/complete-payment to the CSRF exemption list in Plugin::register(), matching the legacy beforeAction() override for off-site gateway payment returns.
Migrate InventoryController, InventoryLocationsController,
TransfersController to src/Http/Controllers/.
Fix a critical, real gap affecting already-merged Stage 9f code:
FieldLayout::createForm() no longer exists on the new-system FieldLayout
class. OrdersController::updateTemplateVariables() passed tabIdPrefix into
the legacy compat shim's config array, which throws immediately — meaning
commerce/orders/{id} has been throwing a hard exception on every load since
Stage 9f merged. Fixed both OrdersController and the new
InventoryLocationsController by adopting the real new pipeline
(FieldLayoutCompiler::compile() + FormHtmlRenderer::render()/tabMenu()),
confirmed against cms-6's own EditElementController::prepareEditor().
InventoryLocationsController's hidden-field injection (previously done by
mutating $form->tabs) moved into the Twig template directly, since the new
FormPayload can't be mutated that way.
Migrate SubscriptionsController and PlansController to Laravel. Subscriptions
uses per-action permission checks rather than a blanket controller-level gate,
edit() adopts the FieldLayoutCompiler/FormHtmlRenderer pipeline (replacing the
removed FieldLayout::createForm()), and completeSubscription() uses Cache::lock
in place of the Yii2 mutex.
Also fixes a systemic gap found while building PlansController::reorder():
Json::decode($request->input('ids')) throws an uncaught TypeError instead of a
clean 400 when 'ids' is missing, since input() returns null instead of
throwing like Yii2's getRequiredBodyParam() did. Same guard added retroactively
to the 6 other already-migrated reorder()-style actions with the identical gap
(Discounts, Sales, ShippingRules, OrderStatuses, LineItemStatuses, Stores).
…mplete
Migrate EmailsController, PdfsController, FormulasController,
EmailPreviewController, DownloadsController, and UsersController to Laravel,
completing the full 48-controller Yii2 to Laravel controller migration.
src-yii2/controllers/ is deleted entirely, including all four now-unused base
classes (BaseController, BaseCpController, BaseAdminController,
BaseFrontEndController).
UsersController (the Commerce tab on the Edit User screen) required a
genuinely different pattern than every other controller in this migration:
the legacy EditUserTrait/EVENT_DEFINE_EDIT_SCREENS mechanism is gone, replaced
by per-screen controllers plus a plain EditUserScreensResolving event that a
plugin listens for to register its nav entry. DownloadsController's per-IP
pdf-challenge rate limit moves to a named PdfChallengeRateLimiter + throttle
middleware, matching the existing CartChallengeRateLimiter shape.
Live testing surfaced two real bugs in EmailPreviewController before they
shipped: ElementQuery::orderBy('RAND()') throws on the new Laravel-based query
builder (raw SQL treated as a column identifier) — fixed with orderByRaw() —
and the method's declared Response return type didn't match its actual string
return value.
…rencies) Relocate Services\Currencies and Services\PaymentCurrencies out of the flat CraftCms\Commerce\Services namespace into Payment\Currencies and Payment\PaymentCurrencies, the first slice of Stage 10's service namespace cleanup. Replace the legacy craft\commerce\records\PaymentCurrency ActiveRecord with a thin Eloquent model at Payment\Records\PaymentCurrency, kept separate from the existing business-object Payment\Models\PaymentCurrency per the lesson from Stage 7c (merging Eloquent persistence into a Component-based rich model breaks bare-property getter routing). The legacy record class is now fully unreferenced and deleted.
Relocate Services\{TaxCategories,TaxZones,Taxes,TaxRates,Vat} to Tax\*.
Replace the legacy craft\commerce\records\{TaxCategory,TaxZone,TaxRate}
ActiveRecord classes with thin Eloquent models under Tax\Records\*
(TaxCategory uses SoftDeletes to match its dateDeleted-based soft-delete
behavior). Move TaxRate's TAXABLE_*/ORDER_TAXABALES constants onto the new
Eloquent class and repoint its 4 consumers (LineItem, TaxRate model,
TaxRatesController, and the still-legacy Tax adjuster).
Also converts a real leftover ActiveRecord query in
TaxRatesController::updateStatus() to Eloquent, and drops a dead
never-populated error-bag check in TaxRates::saveTaxRate() that had no
Eloquent equivalent.
craft\commerce\records\{TaxZone,TaxRate} are now fully unreferenced and
deleted. TaxCategory's legacy record stays — it's still used by the Install
migration and a Codeception ActiveFixture, both Yii2-native infrastructure
outside this stage's scope.
Relocate Services\{ShippingCategories,ShippingZones,ShippingMethods,
ShippingRules,ShippingRuleCategories} to Shipping\*. Replace their legacy
craft\commerce\records\* ActiveRecord classes with thin Eloquent models under
Shipping\Records\* (ShippingCategory uses SoftDeletes). Move
ShippingRuleCategory's CONDITION_* constants onto the new Eloquent class and
repoint its consumers.
Converts two more real leftover ActiveRecord queries to Eloquent
(ShippingMethodsController::updateStatus(), ShippingRules's priority-numbering
query), and removes a dead unused ShippingCategory import in Stores.php.
craft\commerce\records\{ShippingZone,ShippingMethod,ShippingRule,
ShippingRuleCategory} are now fully unreferenced and deleted. ShippingCategory
stays, same reasoning as Stage 10b's TaxCategory (Codeception fixture
dependency).
Relocate Services\{Discounts,Sales,Coupons} to Promotion\*. Replace 10 legacy
craft\commerce\records\* ActiveRecord classes (Discount, DiscountCategory,
DiscountPurchasable, CustomerDiscountUse, EmailDiscountUse, Coupon, Sale,
SaleCategory, SalePurchasable, SaleUserGroup) with thin Eloquent models under
Promotion\Records\*. Move Discount's and Sale's constants onto their Eloquent
classes and repoint all their consumers.
Converts two more real leftover ActiveRecord bulk-toggle queries to Eloquent
(DiscountsController/SalesController::updateStatus()).
Found and fixed a real bug while live-testing saveDiscount(): four Promotion
event classes (DiscountEvent, MatchOrderEvent, MatchLineItemEvent,
DiscountAdjustmentsEvent) were still typed against the legacy
craft\commerce\models\Discount even though every real caller has passed the
new Promotion\Models\Discount since Stage 6b — PHP enforces constructor
property types at runtime, so this threw a TypeError on every saveDiscount()
call and every discount-adjustment event fired during order calculation.
8 of the 10 legacy records are now fully unreferenced and deleted. Discount
and Coupon stay, same reasoning as prior stages (fixture/validator/test
dependencies outside this stage's scope).
Relocate Services\{CatalogPricing,CatalogPricingRules} to CatalogPricing\*.
Replace the legacy craft\commerce\records\{CatalogPricingQueue,
CatalogPricingRule} ActiveRecord classes with thin Eloquent models under
CatalogPricing\Records\*. CatalogPricingQueue's manual getIds()/setIds()
JSON encode/decode methods are replaced by a plain array cast. Move
CatalogPricingRule's APPLY_*/APPLY_PRICE_TYPE_* constants onto the Eloquent
class and repoint its consumers, including the still-legacy catalog pricing
queue job.
Converts one more real leftover ActiveRecord bulk-toggle query to Eloquent
(CatalogPricingRulesController::updateStatus()).
Both legacy records stay this time for a new reason: Install.php's migration
uses their constants directly for enum() column definitions, not a
Codeception fixture. src/ itself no longer references either.
Relocate Services\{Inventory,InventoryLocations} to Inventory\*. Replace the
legacy craft\commerce\records\{InventoryItem,InventoryLocation} ActiveRecord
classes with thin Eloquent models under Inventory\Records\* (InventoryLocation
uses SoftDeletes). Repoint Purchasable\Elements\Purchasable's draft-apply
inventory-item transfer logic, the only other real consumer of
InventoryItemRecord outside the service itself.
Removes another dead unused legacy record import in the src-yii2/services
wrapper (same shape found in Stage 10a/10c).
InventoryItem's legacy record is now fully unreferenced and deleted.
InventoryLocation stays, same reasoning as Stage 10e (Install.php migration
dependency).
…uster)
Relocate Services\{Products,Variants,ProductTypes} to Catalog\* (ProductTypes
nested to Catalog\ProductType\ProductTypes to match that domain's existing
Data/Models/Exceptions sub-namespace convention) and Services\Purchasables to
Purchasable\Purchasables.
No legacy ActiveRecord conversion needed this time -- ProductTypes has used
Eloquent persistence (Catalog\ProductType\Models\{ProductType,ProductTypeSite})
since Stage 7e, and Products/Variants/Purchasables never touched records at
all. Pure namespace relocation.
Relocate Services\{Transactions,PaymentSources,Payments,Webhooks,Gateways} to
Payment\* (Gateways nested to Payment\Gateway\Gateways). Replace the legacy
craft\commerce\records\{Transaction,PaymentSource,Gateway} ActiveRecord
classes with thin Eloquent models. Move Transaction's TYPE_*/STATUS_*
constants onto the new Eloquent class and repoint its 5 constants-only
consumers (Payments, Order, OrdersController, and 3 unit tests).
All three legacy records are now fully unreferenced and deleted -- confirmed
no fixture, migration, or validator dependency anywhere before removing them.
Relocate Services\{Orders,Carts,OrderNotices,OrderHistories,OrderAdjustments,
OrderStatuses,LineItemStatuses,LineItems} to Order\* (LineItems nested to
Order\LineItem\LineItems). Orders/Carts/OrderNotices/LineItems had no legacy
record work needed (LineItems has been Eloquent since Stage 7c). Replace the
legacy craft\commerce\records\{OrderHistory,OrderAdjustment,OrderStatus,
LineItemStatus} ActiveRecord classes with thin Eloquent models under
Order\Records\* (OrderStatus uses SoftDeletes).
OrderHistory/OrderAdjustment/LineItemStatus are now fully unreferenced and
deleted. OrderStatus stays -- used directly by two Codeception fixture *data*
files that run real queries against it to resolve seed IDs, not just a
Fixture class.
Relocate Services\{Stores,StoreSettings} to Store\*. Replace the legacy
craft\commerce\records\{Store,SiteStore,StoreSettings} ActiveRecord classes
with thin Eloquent models under Store\Records\*. SiteStore and StoreSettings
are keyed by a foreign column (siteId, and the owning store's own id) rather
than an auto-incrementing id, so both need primaryKey/incrementing set
explicitly, same class of bug Stage 7d found on element-backed models.
Repoints two more real consumers outside the services: Store\Models\Store's
currency-change validator and Store\Models\StoreSettings's location-address
update. Found and fixed a second real bug: handleChangedStore() called
getIsNewRecord(), a Yii2-only method with no Eloquent equivalent -- replaced
with !$storeRecord->exists.
All three legacy records stay: StoreRecordTrait, a shared Yii2 ActiveRecord
relation trait, is still used by 8 other legacy records that themselves stay
for fixture/migration reasons. src/ itself no longer touches any of the
three.
Relocate Services\{Subscriptions,Plans} to Subscription\*. Replace the legacy
craft\commerce\records\{Plan,Subscription} ActiveRecord classes with thin
Eloquent models under Subscription\Records\*. Subscription is a special
case: the still-legacy Subscription element uses the same legacy record for
its own element/type-table pairing, so the new Eloquent class is a
read/update-only sibling for src/, not a replacement -- documented in its
docblock.
Repoints a second real consumer, SubscriptionsController::subscribe()'s
returnUrl update. Both legacy records stay (Plan: fixture; Subscription:
still-legacy element's own pairing). src/ no longer references either.
Services\{Emails,Pdfs} -> Email\Emails / Pdf\Pdfs. Replaced the legacy
craft\commerce\records\{Email,Pdf} ActiveRecord classes with new Eloquent
models under Email\Records\Email / Pdf\Records\Pdf.
Hit the getIsNewRecord()-doesn't-exist-on-Eloquent bug (first found in
Stage 10j) twice more, in both handleChangedEmail() and handleChangedPdf() -
fixed with !$record->exists. Also converted a leftover updateAll() bulk
default-toggle in handleChangedPdf() to a proper Eloquent where()->update().
Moved both records' constants (LOCALE_ORDER_LANGUAGE, TYPE_CUSTOMER/
TYPE_CUSTOM, PAPER_ORIENTATION_PORTRAIT/LANDSCAPE) onto the new Eloquent
classes and repointed 5 constants-only consumers.
Both legacy records stay: still used by StoreRecordTrait (same reason
Store/SiteStore/StoreSettings stayed in 10j), and Email additionally has
a Codeception fixture dependency. src/ no longer references either.
Services\Customers -> Customer\Customers, Services\Formulas -> Formula\Formulas (both new top-level namespaces). Last cluster with any remaining craft\commerce\records\* usage to convert. Replaced craft\commerce\records\Customer with a new Eloquent model, Customer\Records\Customer. Formulas has no record usage - pure namespace move. Legacy Customer record stays: the still-legacy CustomerBehavior (attached to every User element) queries it directly. Repointed src-yii2/services/Customers.php's CustomerRecord import/return type to the new Eloquent class since its ensureCustomer(): CustomerRecord return type is runtime-checked. Found (not fixed - out of scope) a CustomerBehavior/User-element compatibility gap: setting a dynamic property on a User instance with CustomerBehavior attached throws on undefined User::EVENT_DEFINE_RULES/EVENT_DEFINE_FIELDS constants.
Stage 10's bulk sed namespace-repointing passes (10a-10m) left many files' use blocks out of alphabetical order, since sed replaces a line in place without re-sorting its neighbors. Deferred cleanup to a single final pass rather than repeatedly reordering the same blocks after every sub-stage. Ran composer run fix-cs (ecs, OrderedImportsFixer) across src/ and tests/ - 107 files fixed, pure use-line reordering (plus one unrelated pre-existing binary-operator-spacing nit in a test file). Verified via git diff that no non-use content changed, and php -l across all 107 touched files. src/Services/ is now fully empty and removed - all 44 services that started this stage in the flat namespace now live in their feature namespace. Stage 10 (Service Namespace & Record Cleanup) is complete.
…ead code)
Convert craft\commerce\records\{Purchasable,PurchasableStore} to Eloquent
(Purchasable\Records\*) - the only 2 legacy records still directly used by
already-migrated src/ code (Purchasable/Donation elements), a real gap left
over from Stage 7a.
Both legacy records are fully deleted, not just repointed. PurchasableStore
uses StoreRecordTrait (shared with 7 other still-legacy records), so a
record using it can't automatically be deleted - but re-verifying found zero
other consumers of this specific record anywhere in the codebase, so it's
safe to remove entirely.
Also delete 3 confirmed-orphaned legacy files: elements/db/PurchasableQuery.php
(921 lines, nothing extends it - Variant/Donation's query classes already
extend the new Purchasable\Queries\PurchasableQuery, Product's extends
ElementQuery directly), records/CatalogPricing.php, records/OrderStatusEmail.php.
Remove 2 stale instanceof PurchasableQuery branches (with inaccurate
"not yet migrated" comments - Product/Variant were migrated in Stage 7d) in
Purchasables.php and OrdersController.php, and fix a stale assertion in
DonationQueryTest.php that tested against the legacy PurchasableQuery class.
…ords The previous commit (f9a557a) deleted the legacy records/{Purchasable, PurchasableStore}.php and added their Eloquent replacements, but a failed git add (bad pathspec aborted the whole invocation) left the actual consumer edits unstaged and out of that commit - leaving HEAD in a broken state referencing deleted classes. This completes it: repoints Purchasable.php/Donation.php/Purchasables.php/OrdersController.php to the new Eloquent records, fixes the stale DonationQueryTest.php assertion, and adds the changelog entry.
Migrate the 12 remaining real src-yii2/errors/*.php classes into their
feature namespace (5 were already done in earlier stages): Email\Exceptions\
EmailException, Payment\Gateway\Exceptions\GatewayException, Order\Exceptions\
LineItemException, Payment\Exceptions\{PaymentException,PaymentSourceException,
PaymentSourceCreatedLaterException,RefundException,TransactionException},
Shipping\Exceptions\ShippingMethodException, Store\Exceptions\
StoreNotFoundException, Subscription\Exceptions\SubscriptionException, and a
new top-level Exceptions\NotImplementedException (no natural feature home).
All plain `extends \Exception` matching the established minimal style, except
NotImplementedException (extends \BadMethodCallException, its original SPL
parent) and PaymentSourceCreatedLaterException (extends PaymentSourceException,
preserving the sibling relationship). Dropped StoreNotFoundException's unused
getName() method.
Repoint every real consumer across src-yii2/ and src/. Fix a bulk-sed
self-inflicted bug found via live verification: the repointing pass also
matched and corrupted each new stub's own class_alias() second-argument
string literal, breaking the backward-compatible alias - fixed by hand
before committing.
…x bug) Several lines assigned $request->input(...) straight to non-nullable/strictly- typed ProductType properties with no fallback or (bool) cast, ported verbatim from 5.x's getBodyParam() calls. 5.x's Yii2 model never declared strict property types so this was silently harmless; the new Data class does declare them, so the exact same request shape (e.g. saving with a title-format field hidden/unsubmitted) throws a TypeError instead. Also adds VariantQuerySmokeTest, closing a coverage gap for VariantQuery's own scopes (typeId, productStatus, editable) that had no dedicated tests before or after last session's Concerns/ trait extraction.
# Conflicts: # src-yii2/templates/settings/gateways/_edit.twig # src-yii2/templates/store-management/discounts/_edit.twig # src-yii2/templates/store-management/pricing-rules/_edit.twig # src-yii2/templates/store-management/pricing-rules/_slideout.twig # src-yii2/templates/store-management/shipping/shippingmethods/_edit.twig # src-yii2/templates/store-management/shipping/shippingrules/_edit.twig # src/Address/Conditions/PostalCodeFormulaConditionRule.php # src/CatalogPricing/Conditions/CatalogPricingCustomerConditionRule.php # src/CatalogPricing/Conditions/CatalogPricingPurchasableConditionRule.php # src/Customer/Conditions/HasOrdersConditionRule.php # src/Http/Controllers/Settings/ProductTypesController.php # src/Http/Controllers/StoreManagement/CatalogPricingController.php # src/Http/Controllers/StoreManagement/StoreManagementController.php # src/Order/Conditions/ContainsPurchasablesConditionRule.php # src/Order/Conditions/CustomerConditionRule.php # src/Order/Conditions/HasPurchasableConditionRule.php # src/Order/Conditions/OrderCurrencyValuesAttributeConditionRule.php # src/Product/Variant/Conditions/VariantConditionRule.php # src/Product/Variant/Conditions/VariantProductConditionRule.php
# Conflicts: # CHANGELOG.md
getConditionRules() returned a plain array in real 5.x, so empty() on it correctly detected "no rules configured". The ported condition system wraps it in a ConditionGroupInterface object instead, which empty() can never treat as falsy — every affected check silently always evaluated true. Real-world impact: Discount::hasOrderCondition() and friends always returned true once a condition object existed, regardless of whether it had any rules; CatalogPricingRule::getPurchasableIds() always ran its narrowing queries even with no condition configured; CatalogPricing::generateCatalogPrices() incorrectly skipped rules with no customer condition for most customers; Product's config-export never found a ProductTypeConditionRule to narrow by. Fixed by calling ->getRules() to reach the actual rule array. Found via composer run phpstan (empty.expr); confirmed as a porting regression, not a 5.x behavior, via git show origin/5.x.
… into feature/6.x-templating # Conflicts: # src/Http/Controllers/StoreManagement/ShippingCategoriesController.php
…OM-661) Interim step ahead of the Form API/new-UI condition builder: replace the commerceConditionBuilderHtml Twig filter with controller-rendered ConditionBuilderRenderer output passed into templates as plain variables. Also fixes shippingzones/taxzones address-condition fields, which were silently broken via a condition.builderHtml property that no longer exists.
…onRuleTest to Pest (COM-654)
…ustomers, Discounts, Inventory, LineItems, Orders, PaymentCurrencies, Sales, Shipping, Stores, and TaxCategories (COM-652)
# Conflicts: # src-yii2/templates/store-management/discounts/_edit.twig # src-yii2/templates/store-management/pricing-rules/_edit.twig # src-yii2/templates/store-management/pricing-rules/_slideout.twig # src-yii2/templates/store-management/shipping/shippingmethods/_edit.twig # src-yii2/templates/store-management/shipping/shippingrules/_edit.twig # src-yii2/templates/store-management/shipping/shippingzones/_fields.twig # src-yii2/templates/store-management/tax/taxzones/_fields.twig # src/Http/Controllers/Settings/GatewaysController.php # src/Http/Controllers/Settings/ShippingMethodsController.php # src/Http/Controllers/Settings/ShippingRulesController.php # src/Http/Controllers/Settings/ShippingZonesController.php # src/Http/Controllers/Settings/TaxZonesController.php # src/Http/Controllers/StoreManagement/CatalogPricingRulesController.php
…anch using removed Yii2 event API (COM-667)
# Conflicts: # src/CatalogPricing/CatalogPricing.php
[6.x] Converting CP templates to forms
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
https://linear.app/craftcms/issue/COM-613/laravel-port